/**
 * Mock 弹幕数据生成器
 * 生成500条长短不一的弹幕数据
 */

import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

// 弹幕文本模板 - 按长度分类
const barrageTexts = {
  // 1-2个字
  short: [
    '好', '赞', '牛', '强', '棒', '爱', '哇', '6', '👍', '❤️', '🔥', '👏', '😂', '😍', '🎉', '💪',
    '牛逼', '厉害', '太棒', '给力', '优秀', '完美', '精彩', '不错', '支持', '加油'
  ],
  
  // 3-6个字
  medium: [
    '太棒了！', '真不错', '学到了', '很实用', '讲得好', '感谢分享', '继续加油', '期待更新',
    '内容很棒', '质量很高', '很有帮助', '收获满满', '干货满满', '值得学习', '技术很强',
    '这个厉害了', '代码写得好', '思路很清晰', '解释得很好', '很有意思啊'
  ],
  
  // 7-10个字
  long: [
    '这个视频质量真的很不错', '学到了很多新知识，感谢', '内容很详细，讲解得很清楚',
    '这个技术栈真的很实用啊', '讲得非常好，期待更多内容', '代码质量很高，值得学习',
    '这个案例分析得很透彻深入', '实战经验分享得很有价值意义', '这个解决方案思路很清晰明确',
    '技术分享得很详细，收获满满', '这种教学方式很容易理解接受', '项目架构设计得很合理科学'
  ],
  
  // 11-15个字
  extraLong: [
    '这个项目的技术架构设计得非常合理和科学', '从零开始的教学方式让初学者很容易上手',
    '代码注释写得很详细完整，可读性非常好', '实际项目中的最佳实践经验分享很有价值',
    '这种循序渐进的讲解方式真的很适合学习', '技术栈的选择和搭配都很有前瞻性和实用性',
    '从理论到实践的完整流程讲解得很清楚明白', '这个开源项目对社区的贡献真的很大很有意义',
    '复杂问题的简化处理方式展现了很强的技术功底', '跨平台兼容性的处理方案很值得借鉴和学习'
  ]
}

// 颜色数组
const colors = [
  '#FFD700', '#FF6B6B', '#4ECDC4', '#96CEB4', '#DDA0DD', '#85C1E9', '#F1948A', '#82E0AA',
  '#F7DC6F', '#BB8FCE', '#F8C471', '#AED6F1', '#FADBD8', '#D5DBDB', '#A9DFBF', '#F9E79F',
  '#D2B4DE', '#F5B7B1', '#A3E4D7', '#F8D7DA', '#D1ECF1', '#D4EDDA', '#FFF3CD', '#E2E3E5',
  '#FCF4A3', '#0ABDE3', '#006BA6', '#FF9FF3', '#A29BFE', '#00B894', '#FDCB6E', '#E17055',
  '#6C5CE7', '#FD79A8', '#00CEC9', '#55A3FF', '#FF7675', '#74B9FF', '#A29BFE', '#FD79A8'
]

// 用户名前缀
const userPrefixes = [
  '观众', '用户', '学习者', '程序员', '开发者', '技术爱好者', '学生', '工程师', 
  '前端开发', '后端开发', '全栈开发', 'UI设计师', '产品经理', '测试工程师'
]

// 弹幕类型
const types = ['scroll', 'top', 'bottom']

/**
 * 随机选择数组中的元素
 */
function randomChoice(array) {
  return array[Math.floor(Math.random() * array.length)]
}

/**
 * 生成随机时间 (0-60秒，1分钟视频)
 */
function randomTime() {
  return Math.round(Math.random() * 60 * 10) / 10 // 保留1位小数
}

/**
 * 生成随机字体大小
 */
function randomFontSize(textLength) {
  if (textLength <= 2) return Math.floor(Math.random() * 6) + 20 // 20-25
  if (textLength <= 6) return Math.floor(Math.random() * 4) + 18 // 18-21
  if (textLength <= 10) return Math.floor(Math.random() * 3) + 17 // 17-19
  return Math.floor(Math.random() * 2) + 16 // 16-17
}

/**
 * 根据长度权重选择弹幕文本
 */
function getRandomBarrageText() {
  const rand = Math.random()
  
  // 权重分配：短文本40%，中等30%，长文本20%，超长10%
  if (rand < 0.4) {
    return randomChoice(barrageTexts.short)
  } else if (rand < 0.7) {
    return randomChoice(barrageTexts.medium)
  } else if (rand < 0.9) {
    return randomChoice(barrageTexts.long)
  } else {
    return randomChoice(barrageTexts.extraLong)
  }
}

// 视频ID列表（对应public/videos/中的视频）
const videoIds = [
  'local-video-1', // 视频一.mp4
  'local-video-2', // 视频二.mp4
  'local-video-3'  // 视频三.mp4
]

/**
 * 生成单条弹幕数据
 */
function generateBarrage(id) {
  const text = getRandomBarrageText()
  const fontSize = randomFontSize(text.length)
  
  return {
    id: id.toString(),
    text: text,
    color: randomChoice(colors),
    time: randomTime(),
    type: randomChoice(types),
    fontSize: fontSize,
    user: `${randomChoice(userPrefixes)}${Math.floor(Math.random() * 1000)}`,
    timestamp: new Date().toISOString(),
    videoId: randomChoice(videoIds) // 随机分配给某个视频
  }
}

/**
 * 生成500条弹幕数据
 */
function generateMockData() {
  console.log('🚀 开始生成500条弹幕数据...')
  
  const barrages = []
  
  for (let i = 1; i <= 500; i++) {
    barrages.push(generateBarrage(i))
    
    // 每生成100条显示进度
    if (i % 100 === 0) {
      console.log(`📝 已生成 ${i}/500 条弹幕`)
    }
  }
  
  // 按时间排序
  barrages.sort((a, b) => a.time - b.time)
  
  const data = {
    barrages: barrages
  }
  
  // 确保目录存在
  const publicDir = path.join(__dirname, '../public')
  if (!fs.existsSync(publicDir)) {
    fs.mkdirSync(publicDir, { recursive: true })
  }
  
  // 写入文件
  const filePath = path.join(publicDir, 'db.json')
  fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8')
  
  console.log('✅ Mock 数据生成完成！')
  console.log(`📁 文件路径: ${filePath}`)
  console.log(`📊 数据统计:`)
  
  // 统计不同长度的弹幕数量
  const stats = {
    short: barrages.filter(b => b.text.length <= 2).length,
    medium: barrages.filter(b => b.text.length >= 3 && b.text.length <= 6).length,
    long: barrages.filter(b => b.text.length >= 7 && b.text.length <= 10).length,
    extraLong: barrages.filter(b => b.text.length >= 11).length
  }
  
  console.log(`   - 短弹幕 (1-2字): ${stats.short} 条`)
  console.log(`   - 中弹幕 (3-6字): ${stats.medium} 条`)
  console.log(`   - 长弹幕 (7-10字): ${stats.long} 条`)
  console.log(`   - 超长弹幕 (11-15字): ${stats.extraLong} 条`)
  console.log(`   - 总计: ${barrages.length} 条`)
  
  return data
}

// 直接运行生成数据
generateMockData()

export { generateMockData }
